home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 10 / FM Towns Free Software Collection 10.iso / fb386 / tool / peer011b / bb011b.asm next >
Assembly Source File  |  1995-02-10  |  15KB  |  415 lines

  1. 10 ';**************************** BB.REX Ver0.11B **********************
  2. 20 ';***  各プロシジャJMPル-チン ***
  3. 30 '                                                   ;CALL番地
  4. 40 ' jmp p_no0  ;機械語プロシジャNo.0へ [拡張PEEK]        &H00
  5. 50 ' jmp p_no1  ;機械語プロシジャNo.1へ [拡張POKE]        &H05
  6. 60 ' jmp p_no2  ;機械語プロシジャNo.2へ [各BIOSコ-ル+α] &H0A
  7. 70 '
  8. 80 ';***  機械語プロシジャNo.0 ***
  9. 90 ';DUM&=CALLM (&H00,SRC&,ADR&,?,??)
  10. 100 ';指定アドレスを、指定単位 "?"(1,2,4byt)で読む
  11. 110 ';読んだDATAを並べ替えるかどうか指定する("??"=1で並び替え)
  12. 120 '
  13. 130 'p_no0:
  14. 140 '
  15. 150 ';equの後ろは、十進数
  16. 160 '
  17. 170 ' src   equ 4   ;スタックに積まれた数値(espからのオフセット値)
  18. 180 ' adr   equ 8   ;                〃
  19. 190 ' byt   equ 12  ;                〃
  20. 200 ' trn   equ 16  ;                〃
  21. 210 '
  22. 220 '  mov  ebp , esp        ;esp(オフセット 0)を、ebp へ
  23. 230 '
  24. 240 ';読み取りバイト数のチェック
  25. 250 '
  26. 260 '  cmp  [ebp+byt] , 1
  27. 270 '  jz read_one           ;1なら 8bit(1byt)単位へ
  28. 280 '
  29. 290 '  cmp  [ebp+byt] , 2
  30. 300 '  jz read_two           ;2なら16bit(2byt)単位へ
  31. 310 '
  32. 320 ';各バイト数で読み取り
  33. 330 '
  34. 340 'read_four:
  35. 350 '  mov  bx  , [ebp+src]  ;スタックからBASIC変数srcの数値をbxへ
  36. 360 '  mov  ds  , bx         ;(BASIC変数srcの数値)bxをdsへ 
  37. 370 '  mov  ebx , [ebp+adr]  ;スタックからBASIC変数adrの数値をebxへ
  38. 380 '  mov  eax , ds:[ebx]   ;dsセレクタとebxオフセットの示すアドレスの数
  39. 390 '                        ;値をeaxへ
  40. 400 '  cmp  [ebp+trn]  ,  1                      
  41. 410 '  jz   transfer_four    ;4Byt並び替えル-チンへ
  42. 420 '
  43. 430 'read_four_return:
  44. 440 '  ret                   ;BASICへ戻る
  45. 450 '
  46. 460 'read_one:
  47. 470 '  mov  bx  , [ebp+src]
  48. 480 '  mov  ds  , bx
  49. 490 '  mov  ebx , [ebp+adr]
  50. 500 '  mov  al  , ds:[ebx]   ;dsセレクタとebxオフセットの示すアドレスの数
  51. 510 '                        ;値をalへ(余計な型は、書かない方がいい)
  52. 520 '                        ;レジスタがalだからだろうか?
  53. 530 '  ret                   ;BASICへ戻る
  54. 540 '
  55. 550 'read_two:
  56. 560 '  mov  bx  , [ebp+src]
  57. 570 '  mov  ds  , bx
  58. 580 '  mov  ebx , [ebp+adr]
  59. 590 '  mov  ax  , ds:[ebx]   ;dsセレクタとebxオフセットの示すアドレスの数
  60. 600 '                        ;値をaxへ
  61. 610 '  cmp  [ebp+trn]  ,  1                      
  62. 620 '  jz   transfer_two     ;2Byt並び替えル-チンへ
  63. 630 '
  64. 640 'read_two_return:
  65. 650 '  ret                   ;BASICへ戻る
  66. 660 '
  67. 670 'transfer_four:
  68. 680 '  mov  cl , 8  
  69. 690 '  ror  ax , cl         ;axの"1-0"を"0-1"へ
  70. 700 '  mov  cl , 16  
  71. 710 '  ror  eax, cl         ;eaxの"3-2-0-1"を"0-1-3-2"へ
  72. 720 '  mov  cl , 8  
  73. 730 '  ror  ax , cl         ;axの"3-2"を"2-3"へ (eax="0-1-2-3")
  74. 740 '  jmp  read_four_return 
  75. 750 '  
  76. 760 'transfer_two:
  77. 770 '  mov  cl , 8  
  78. 780 '  ror  ax , cl         ;axの"1-0"を"0-1"へ (eax="0-1")
  79. 790 '  jmp  read_two_return 
  80. 800 '                              ;使用レジスタ bx,ebx,eax,ds,cl
  81. 810 '                              ;使用レジスタ ebp,esp
  82. 820 '
  83. 830 ';***  機械語プロシジャNo.1 ***
  84. 840 ';CALLM &H05,SRC&,ADR&,DAT&,?
  85. 850 ';指定アドレスにDAT&を、指定単位 "?"(1,2,4byt)で書き込む
  86. 860 '
  87. 870 'p_no1:
  88. 880 '
  89. 890 ';equの後ろは、十進数
  90. 900 '
  91. 910 ' sr    equ 4              ;同じ文字列をEQUするとエラ-の元
  92. 920 ' ad    equ 8
  93. 930 ' dat   equ 12
  94. 940 ' b     equ 16
  95. 950 '
  96. 960 '  mov  ebp , esp
  97. 970 '
  98. 980 ';書き込みバイト数のチェック
  99. 990 '
  100. 1000 '  cmp [ebp+b]   , 1
  101. 1010 '  jz write_one             ;1なら 8bit(1byt)単位へ
  102. 1020 '
  103. 1030 '  cmp [ebp+b]   , 2
  104. 1040 '  jz write_two             ;2なら16bit(2byt)単位へ
  105. 1050 '
  106. 1060 ';各バイト数で書き込み
  107. 1070 '
  108. 1080 'write_four:
  109. 1090 '  mov  bx       , [ebp+sr] ;スタックからBASIC変数srcの数値をbxへ
  110. 1100 '  mov  ds       , bx       ;(BASIC変数srcの数値)bxをdsへ 
  111. 1110 '  mov  ebx      , [ebp+ad] ;スタックからBASIC変数adrの数値をebxへ
  112. 1120 '  mov  eax      , [ebp+dat];スタックからBASIC変数datの数値をeaxへ
  113. 1130 '  mov  ds:[ebx] , eax      ;eaxの数値をdsセレクタとebxオフセットの示す
  114. 1140 '                           ;アドレスに書く
  115. 1150 '  ret                      ;BASICへ戻る
  116. 1160 '
  117. 1170 'write_one:
  118. 1180 '  mov  bx       , [ebp+sr]
  119. 1190 '  mov  ds       , bx
  120. 1200 '  mov  ebx      , [ebp+ad]
  121. 1210 '  mov  al       , [ebp+dat]
  122. 1220 '  mov  ds:[ebx] , al       ;alの数値をdsセレクタとebxオフセットの示す
  123. 1230 '                          ;アドレスに書く
  124. 1240 '  ret                     ;BASICへ戻る
  125. 1250 ' 
  126. 1260 'write_two:
  127. 1270 '  mov  bx       , [ebp+sr]
  128. 1280 '  mov  ds       , bx
  129. 1290 '  mov  ebx      , [ebp+ad]
  130. 1300 '  mov  ax       , [ebp+dat]
  131. 1310 '  mov  ds:[ebx] , ax       ;axの数値をdsセレクタとebxオフセットの示す
  132. 1320 '                          ;アドレスに書く
  133. 1330 '  ret                     ;BASICへ戻る
  134. 1340 '  
  135. 1350 '                              ;使用レジスタ bx,ebx,al,ax,eax,ds
  136. 1360 '                              ;使用レジスタ ebp,esp
  137. 1370 '                              
  138. 1380 ';***  機械語プロシジャNo.2 ***
  139. 1390 ';CALLM &h0A,BIOSNO&,VARPTR(R_EAX&),VARPTR(R_EBX&),VARPTR(R_ECX&),VARPTR(R_EDX&),VARPTR(R_ESI&),VARPTR(R_EDI&),VARPTR(R_DS%),VARPTR(R_ES%),VARPTR(R_FS%),VARPTR(R_GS%)
  140. 1400 '
  141. 1410 'p_no2:
  142. 1420 '
  143. 1430 ';equの後ろは、十六進数
  144. 1440 '
  145. 1450 ' tbios     equ 0110h ;TBIOSセレクタ(実行用)
  146. 1460 '
  147. 1470 ' n_gra     equ 0020h ;ネイティブ グラフィック BIOS
  148. 1480 ' n_mus     equ 0040h ;ネイティブ マウス BIOS
  149. 1490 ' n_spr     equ 0060h ;ネイティブ スプライト BIOS
  150. 1500 ' n_snd     equ 0080h ;ネイティブ サウンド BIOS
  151. 1510 ' n_fnt     equ 00a0h ;ネイティブ フォント BIOS
  152. 1520 ' n_mid     equ 00c0h ;ネイティブ MIDI BIOS
  153. 1530 ' n_sndint  equ 01a0h ;ネイティブ 音源割り込み管理 BIOS
  154. 1540 ' n_sysinf  equ 01c0h ;ネイティブ システム情報 BIOS
  155. 1550 '
  156. 1560 ' dos_call  equ 21h   ;システムコ-ル
  157. 1570 ' ms_cdex   equ 2fh   ;MSCDEXのドライブ番号読み取り
  158. 1580 '
  159. 1590 ' r_exserv  equ 8eh   ;拡張サ-ビスル-チン BIOS
  160. 1600 ' r_key     equ 90h   ;キ-ボ-ド BIOS
  161. 1610 ' r_con     equ 91h   ;コンソ-ル BIOS
  162. 1620 ' r_gra     equ 92h   ;グラフィック BIOS
  163. 1630 ' r_disk    equ 93h   ;DISK BIOS
  164. 1640 ' r_prin    equ 94h   ;プリンタ- BIOS
  165. 1650 ' r_hard    equ 95h   ;ハ-ドコピ-BIOS
  166. 1660 ' r_t1      equ 96h   ;カレンダ時計 BIOS
  167. 1670 ' r_t2      equ 97h   ;タイマ管理 BIOS
  168. 1680 ' r_t3      equ 98h   ;時計管理 BIOS
  169. 1690 ' r_mus     equ 99h   ;マウス BIOS(キ-ボ-ド接続のFMR用)
  170. 1700 ' r_rs232c  equ 9bh   ;rs232c BIOS
  171. 1710 ' r_beep    equ 9eh   ;BEEP BIOS
  172. 1720 ' r_int     equ aeh   ;割り込み管理 BIOS 
  173. 1730 ' r_serv    equ afh   ;サ-ビスル-チン BIOS
  174. 1740 ' r_k1      equ ech   ;かな漢字変換(表示制御) BIOS
  175. 1750 ' r_k2      equ edh   ;かな漢字変換(ストリング変換) BIOS
  176. 1760 ' r_st      equ fdh   ;ソフトタイマ- BIOS
  177. 1770 '
  178. 1780 ';equの後ろは、十進数
  179. 1790 '
  180. 1800 ' biosno    equ 4    ;スタックに積まれた数値    (espからのオフセット)
  181. 1810 ' r_eax     equ 8    ;スタックに積まれたアドレス(espからのオフセット)
  182. 1820 ' r_ebx     equ 12   ;                    〃
  183. 1830 ' r_ecx     equ 16   ;                    〃
  184. 1840 ' r_edx     equ 20   ;                    〃
  185. 1850 ' r_esi     equ 24   ;                    〃
  186. 1860 ' r_edi     equ 28   ;                    〃
  187. 1870 ' r_ds      equ 32   ;                    〃
  188. 1880 ' r_es      equ 36   ;                    〃
  189. 1890 ' r_fs      equ 40   ;                    〃
  190. 1900 ' r_gs      equ 44   ;                    〃
  191. 1910 '
  192. 1920 ';各変数アドレスより数値を各レジスタへ         
  193. 1930 '  mov  ebp , esp        ;esp(オフセット 0)をebp へ
  194. 1940 '  mov  eax , [ebp+r_gs] ;変数r_gsのアドレスをeax へ
  195. 1950 '  mov  gs  ,   [eax]      ;変数r_gsの数値をgs へ
  196. 1960 '  mov  eax , [ebp+r_fs] ;変数r_fsのアドレスをeax へ
  197. 1970 '  mov  fs  ,   [eax]      ;変数r_fsの数値をfs へ
  198. 1980 '  mov  eax , [ebp+r_es] ;変数r_esのアドレスをeax へ
  199. 1990 '  mov  es  ,   [eax]      ;変数r_esの数値をes へ
  200. 2000 '  mov  eax , [ebp+r_ds] ;変数r_dsのアドレスをeax へ
  201. 2010 '  mov  ds  ,   [eax]      ;変数r_dsの数値をds へ 
  202. 2020 '
  203. 2030 '  mov  edi , [ebp+r_edi];変数r_ediのアドレスをediへ
  204. 2040 '  mov  edi ,   [edi]      ;変数r_ediの数値をediへ
  205. 2050 '  mov  esi , [ebp+r_esi];変数r_esiのアドレスをesiへ
  206. 2060 '  mov  esi ,   [esi]      ;変数r_esiの数値をesiへ
  207. 2070 '  mov  edx , [ebp+r_edx];変数r_edxのアドレスをedxへ
  208. 2080 '  mov  edx ,   [edx]      ;変数r_edxの数値をedxへ
  209. 2090 '  mov  ecx , [ebp+r_ecx];変数r_ecxのアドレスをecxへ
  210. 2100 '  mov  ecx ,   [ecx]      ;変数r_ecxの数値をecxへ
  211. 2110 '  mov  ebx , [ebp+r_ebx];変数r_ebxのアドレスをebxへ
  212. 2120 '  mov  ebx ,   [ebx]      ;変数r_ebxの数値をebxへ
  213. 2130 '  mov  eax , [ebp+r_eax];変数r_eaxのアドレスをeaxへ
  214. 2140 '  mov  eax ,   [eax]      ;変数r_eaxの数値をeaxへ
  215. 2150 '
  216. 2160 ';ネイティブBIOSチェック
  217. 2170 '  cmp word ptr [ebp+biosno] , n_gra
  218. 2180 '  jz   graphic_nbios
  219. 2190 '  cmp word ptr [ebp+biosno] , n_mus
  220. 2200 '  jz   mouse_nbios
  221. 2210 '  cmp word ptr [ebp+biosno] , n_spr
  222. 2220 '  jz   sprite_nbios
  223. 2230 '  cmp word ptr [ebp+biosno] , n_snd
  224. 2240 '  jz   sound_nbios
  225. 2250 '  cmp word ptr [ebp+biosno] , n_fnt
  226. 2260 '  jz   font_nbios
  227. 2270 '  cmp word ptr [ebp+biosno] , n_mid
  228. 2280 '  jz   midi_nbios
  229. 2290 '  cmp word ptr [ebp+biosno] , n_sndint
  230. 2300 '  jz   sound_int_control_nbios
  231. 2310 '  cmp word ptr [ebp+biosno] , n_sysinf
  232. 2320 '  jz   system_information_nbios
  233. 2330 '
  234. 2340 ';リアルBIOSチェック
  235. 2350 '  cmp  [ebp+biosno] , dos_call
  236. 2360 '  jz   dos
  237. 2370 '  cmp  [ebp+biosno] , ms_cdex
  238. 2380 '  jz   mscdex_driveno
  239. 2390 '  cmp  [ebp+biosno] , r_exserv
  240. 2400 '  jz   exservice_rbios
  241. 2410 '  cmp  [ebp+biosno] , r_key
  242. 2420 '  jz   key_rbios
  243. 2430 '  cmp  [ebp+biosno] , r_con
  244. 2440 '  jz   console_rbios
  245. 2450 '  cmp  [ebp+biosno] , r_gra
  246. 2460 '  jz   graphic_rbios
  247. 2470 '  cmp  [ebp+biosno] , r_disk
  248. 2480 '  jz   disk_rbios
  249. 2490 '  cmp  [ebp+biosno] , r_prin
  250. 2500 '  jz   printer_rbios
  251. 2510 '  cmp  [ebp+biosno] , r_hard
  252. 2520 '  jz   hardcopy_rbios
  253. 2530 '  cmp  [ebp+biosno] , r_t1
  254. 2540 '  jz   time1_rbios
  255. 2550 '  cmp  [ebp+biosno] , r_t2
  256. 2560 '  jz   time2_rbios
  257. 2570 '  cmp  [ebp+biosno] , r_t3
  258. 2580 '  jz   time3_rbios
  259. 2590 '  cmp  [ebp+biosno] , r_mus
  260. 2600 '  jz   mouse_rbios
  261. 2610 '  cmp  [ebp+biosno] , r_rs232c
  262. 2620 '  jz   rs232c_rbios
  263. 2630 '  cmp  [ebp+biosno] , r_beep
  264. 2640 '  jz   beep_rbios
  265. 2650 '  cmp  [ebp+biosno] , r_int
  266. 2660 '  jz   int_rbios
  267. 2670 '  cmp  [ebp+biosno] , r_serv
  268. 2680 '  jz   service_rbios
  269. 2690 '  cmp  [ebp+biosno] , r_k1  
  270. 2700 '  jz   kanji1_rbios
  271. 2710 '  cmp  [ebp+biosno] , r_k2  
  272. 2720 '  jz   kanji2_rbios
  273. 2730 '  cmp  [ebp+biosno] , r_st
  274. 2740 '  jz   softtimer_rbios
  275. 2750 '
  276. 2760 '     jmp exit
  277. 2770 '
  278. 2780 ';リアルBIOS割り込み
  279. 2790 'exservice_rbios:
  280. 2800 '                 int r_exserv
  281. 2810 '                 jmp exit
  282. 2820 'key_rbios:
  283. 2830 '                 int r_key
  284. 2840 '                 jmp exit
  285. 2850 'console_rbios:
  286. 2860 '                 int r_con
  287. 2870 '                 jmp exit
  288. 2880 'graphic_rbios:
  289. 2890 '                 int r_gra
  290. 2900 '                 jmp exit
  291. 2910 'disk_rbios:
  292. 2920 '                 int r_disk
  293. 2930 '                 jmp exit
  294. 2940 'printer_rbios:
  295. 2950 '                 int r_prin
  296. 2960 '                 jmp exit
  297. 2970 'hardcopy_rbios:
  298. 2980 '                 int r_hard
  299. 2990 '                 jmp exit
  300. 3000 'time1_rbios:
  301. 3010 '                 int r_t1
  302. 3020 '                 jmp exit
  303. 3030 'time2_rbios:
  304. 3040 '                 int r_t2
  305. 3050 '                 jmp exit
  306. 3060 'time3_rbios:
  307. 3070 '                 int r_t3
  308. 3080 '                 jmp exit
  309. 3090 'mouse_rbios:
  310. 3100 '                 int r_mus
  311. 3110 '                 jmp exit
  312. 3120 'rs232c_rbios:
  313. 3130 '                 int r_rs232c
  314. 3140 '                 jmp exit
  315. 3150 'beep_rbios:
  316. 3160 '                 int r_beep
  317. 3170 '                 jmp exit
  318. 3180 'int_rbios:
  319. 3190 '                 int r_int
  320. 3200 '                 jmp exit
  321. 3210 'service_rbios:
  322. 3220 '                 int r_serv
  323. 3230 '                 jmp exit
  324. 3240 'kanji1_rbios:
  325. 3250 '                 int r_k1
  326. 3260 '                 jmp exit
  327. 3270 'kanji2_rbios:
  328. 3280 '                 int r_k2
  329. 3290 '                 jmp exit
  330. 3300 'softtimer_rbios:
  331. 3310 '                 int r_st
  332. 3320 '                 jmp exit
  333. 3330 'dos:
  334. 3340 '                 int dos_call
  335. 3350 '                 jmp exit
  336. 3360 'mscdex_driveno:
  337. 3370 '                 int ms_cdex
  338. 3380 '                 jmp exit
  339. 3390 '
  340. 3400 '
  341. 3410 '
  342. 3420 ';ネイティブBIOS割り込み
  343. 3430 'graphic_nbios:  
  344. 3440 '                push tbios      ;ネイティブBIOS CALL準備
  345. 3450 '                pop  fs
  346. 3460 '                call pword ptr fs:[n_gra] ;ネイティブBIOS CALL
  347. 3470 '                jmp exit
  348. 3480 'mouse_nbios:
  349. 3490 '                push tbios
  350. 3500 '                pop  fs
  351. 3510 '                call pword ptr fs:[n_mus]
  352. 3520 '                jmp exit
  353. 3530 'sprite_nbios:
  354. 3540 '                push tbios
  355. 3550 '                pop  fs
  356. 3560 '                call pword ptr fs:[n_spr]
  357. 3570 '                jmp exit
  358. 3580 'sound_nbios:
  359. 3590 '                push tbios
  360. 3600 '                pop  fs
  361. 3610 '                call pword ptr fs:[n_snd]
  362. 3620 '                jmp exit
  363. 3630 'font_nbios:
  364. 3640 '                push tbios
  365. 3650 '                pop  fs
  366. 3660 '                call pword ptr fs:[n_fnt]
  367. 3670 '                jmp exit
  368. 3680 'midi_nbios:
  369. 3690 '                push tbios
  370. 3700 '                pop  fs
  371. 3710 '                call pword ptr fs:[n_mid]
  372. 3720 '                jmp exit
  373. 3730 'sound_int_control_nbios:
  374. 3740 '                push tbios
  375. 3750 '                pop  fs
  376. 3760 '                call pword ptr fs:[n_sndint]
  377. 3770 '                jmp exit
  378. 3780 'system_information_nbios:
  379. 3790 '                push tbios
  380. 3800 '                pop  fs
  381. 3810 '                call pword ptr fs:[n_sysinf]
  382. 3820 '                                ;ここでネイティブBIOS最後
  383. 3830 '
  384. 3840 'exit:                           ;各レジスタの数値を各変数アドレスへ
  385. 3850 '  push ebx
  386. 3860 '  mov  ebx           , [ebp+r_eax]
  387. 3870 '  mov   [ebx]        , eax
  388. 3880 '  pop  ebx
  389. 3890 '  mov  eax           , [ebp+r_ebx]
  390. 3900 '  mov   [eax]        , ebx
  391. 3910 '  mov  eax           , [ebp+r_ecx]
  392. 3920 '  mov   [eax]        , ecx
  393. 3930 '  mov  eax           , [ebp+r_edx]
  394. 3940 '  mov   [eax]        , edx
  395. 3950 '  mov  eax           , [ebp+r_edi]
  396. 3960 '  mov   [eax]        , edi
  397. 3970 '  mov  eax           , [ebp+r_esi]
  398. 3980 '  mov   [eax]        , esi
  399. 3990 '
  400. 4000 '  mov  eax           , [ebp+r_ds]
  401. 4010 '  mov    [eax]       , ds
  402. 4020 '  mov  eax           , [ebp+r_es]
  403. 4030 '  mov    [eax]       , es
  404. 4040 '  mov  eax           , [ebp+r_fs]
  405. 4050 '  mov    [eax]       , fs
  406. 4060 '  mov  eax           , [ebp+r_gs]
  407. 4070 '  mov    [eax]       , gs
  408. 4080 '
  409. 4090 '  ret
  410. 4100 '
  411. 4110 '                   ;使用レジスタ eax,ebx,ecx,edx,esi,edi,ds,es,fs,gs
  412. 4120 '                   ;使用レジスタ ebp,esp
  413. 4130 '
  414. 4140 ';コ-ド部分=876BYT
  415.